package syncWaitGroupDemo

import (
	"fmt"
	"sync"
)

func main() {
	//demo1()
	demo2()
}

//主要用于处理协程，不用在等待时间
func demo1() {
	//声明一个waitGroup
	var wg sync.WaitGroup
	for i := 0; i < 10; i++ {
		//每次启动协程就 +1 协程计数
		wg.Add(1)
		go func() {
			//执行完成后自动释放
			defer func() {
				wg.Done()
			}()
			fmt.Printf("i= %d \n", i)
		}()
	}
	//主线程就在等待 所有协程执行 执行完后 主动退出
	wg.Wait()
}

//主要用于处理协程，不用在等待时间
//变量上加锁，控制变量的数据同步问题、
func demo2() {
	//声明一个变量
	var count int
	//锁 用于锁定变量的访问 互斥锁
	var m sync.Mutex
	//声明一个waitGroup
	var wg sync.WaitGroup
	for i := 0; i < 10; i++ {
		//启动协程就 +1 协程计数
		wg.Add(1)
		go func() {
			//执行完成后自动释放
			defer func() {
				//释放变量锁子
				m.Unlock()
				//释放等待group 中的一个协程
				wg.Done()
			}()
			//执行变量操作前 加上锁子
			m.Lock()
			count++
			fmt.Printf("i= %d \n", count)
		}()
	}
	//主线程就在等待 所有协程执行 执行完后 主动退出
	wg.Wait()
}
